package com.icehelper.hades.base.exception;



import com.icehelper.hades.base.util.JsonHelper;
import org.slf4j.helpers.MessageFormatter;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;


/**
 * 理财系统基础异常
 */
public class HadesBaseException extends HadesException{

  private static final long serialVersionUID = 8358155700691743034L;
  private static final int argLenLimit = 1000;

  public HadesBaseException() {}

  public HadesBaseException(String message) {
    super(message);
  }

  public HadesBaseException(String message, Throwable cause) {
    super(message, cause);
  }

  public HadesBaseException(Throwable cause) {
    super(cause);
  }

  public HadesBaseException(
      String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
  }

  /**
   * 以格式化的字符串作为message构建AutoBaseException。格式化字符串使用sl4j工具类MessageFormatter。
   * argArr参数如果不是null或CharSequence或Collection或Map，该参数将转换为json形式。
   * 如果某个参数的长度超过1000，将会截取。
   *
   * @param messagePattern 字符串格式
   * @param argArr 参数
   * @return AutoBaseException
   * @see MessageFormatter
   */
  public static HadesBaseException withMsgPattern(String messagePattern, Object... argArr) {
    return withMsgPattern(null, messagePattern, argArr);
  }

  /**
   * 以格式化的字符串作为message构建AutoBaseException。格式化字符串使用sl4j工具类MessageFormatter。
   * argArr参数如果不是null或CharSequence或Collection或Map，该参数将转换为json形式。
   * 如果某个参数的长度超过1000，将会截取。
   *
   * @param cause 要包裹的异常
   * @param messagePattern 字符串格式
   * @param argArr 参数
   * @return AutoBaseException
   * @see MessageFormatter
   */
  public static HadesBaseException withMsgPattern(
      Exception cause, String messagePattern, Object... argArr) {
    String[] strArr = null;
    if (argArr != null) {
      strArr = new String[argArr.length];
      for (int i = 0; i < argArr.length; i++) {
        if (argArr[i] == null
            || argArr[i] instanceof CharSequence
            || argArr[i] instanceof Collection
            || argArr[i] instanceof Map) {
          strArr[i] = Objects.toString(argArr[i]);
        } else {
          strArr[i] = JsonHelper.toJson(argArr[i]);
        }
        // 对长度超过1000的字符串进行截取
        if (strArr[i].length() > argLenLimit) {
          strArr[i] = strArr[i].substring(0, argLenLimit) + "...";
        }
      }
    }
    String message = MessageFormatter.arrayFormat(messagePattern, strArr).getMessage();
    return new HadesBaseException(message, cause);
  }

}
